﻿// CFalseDialog2.cpp: 实现文件
//

#include "pch.h"
#include "简易任务管理器_Tab控件.h"
#include "afxdialogex.h"
#include "CFalseDialog2.h"

#include <TlHelp32.h>

// CFalseDialog2 对话框

IMPLEMENT_DYNAMIC(CFalseDialog2, CDialogEx)

CFalseDialog2::CFalseDialog2(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_DIALOG2, pParent)
{

}

CFalseDialog2::~CFalseDialog2()
{
}

void CFalseDialog2::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, m_list2);
}


BEGIN_MESSAGE_MAP(CFalseDialog2, CDialogEx)
	ON_WM_ERASEBKGND()
	ON_WM_SIZE()
	ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CFalseDialog2::OnRclickList1)
END_MESSAGE_MAP()


// CFalseDialog2 消息处理程序


BOOL CFalseDialog2::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect rect;
	GetClientRect(&rect);

	//设置颜色：
	pDC->FillSolidRect(&rect, RGB(255, 255, 255));



	return true;
	//return CDialogEx::OnEraseBkgnd(pDC);
}


BOOL CFalseDialog2::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化
	m_list2.ModifyStyle(0, LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT
		| WS_VSCROLL | WS_BORDER);
	//设置整行选取：
	m_list2.SetExtendedStyle(LVS_EX_FULLROWSELECT);


	m_list2.InsertColumn(0, L"序号", LVCFMT_LEFT, 50);
	m_list2.InsertColumn(1, L"进程名", LVCFMT_LEFT, 200);
	m_list2.InsertColumn(2, L"进程ID", LVCFMT_LEFT, 200);
	m_list2.InsertColumn(3, L"", LVCFMT_LEFT, 100);
	m_list2.InsertColumn(4, L"选中exe文件中的进程", LVCFMT_LEFT, 750);


	//枚举进程：

	//获取进程快照：
	HANDLE hSnapshot =  CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	PROCESSENTRY32 pe = { 0 };
	pe.dwSize = sizeof(pe);

	BOOL bprocess = Process32First(hSnapshot, &pe);
	int i = 0;
	while (bprocess)
	{
		//序号
		CString str;
		str.Format(L"%d", i + 1);
		m_list2.InsertItem(i, str);

		//进程名
		m_list2.SetItemText(i,1, pe.szExeFile);

		//进程id
		str.Format(L"%d", pe.th32ProcessID);
		m_list2.SetItemText(i, 2, str);


		bprocess = Process32Next(hSnapshot, &pe);

		i++;
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}


void CFalseDialog2::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	if (m_list2.GetSafeHwnd())
	{
		m_list2.MoveWindow(0, 0, cx, cy);
	}
}


//鼠标右击exe 查看exe文件里面有哪些进程
void CFalseDialog2::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码


	//清空第四列的数据，以防多次选择，造成冗余
	int nColumnIndex = 4;
	m_list2.DeleteColumn(nColumnIndex);

	//重新添加标题;
	m_list2.InsertColumn(4, L"选中exe文件中的进程", LVCFMT_LEFT, 750);



	POSITION pos = m_list2.GetFirstSelectedItemPosition();
	int sel = m_list2.GetNextSelectedItem(pos);

	if (sel < 0)
	{
		MessageBox(L"none");
		*pResult = 0;
		return;

	}

	DWORD  id = _wtoi(m_list2.GetItemText(sel, 1)/*把他变成整数*/);

	//进去获取进程id/快照
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,id);

	MODULEENTRY32 me = { 0 };
	me.dwSize = sizeof(me);

	bool b = Module32First(hSnapshot, &me);
	
	m_list2.SetItemText(sel, 4, L"该exe文件的进程如下：");
	sel += 1;

	while (b)
	{
		//显示被选中的exe文件中的进程
		m_list2.SetItemText(sel, 4, me.szExePath);

		b = Module32Next(hSnapshot, &me);

		sel++;
	}
	m_list2.SetItemText(sel, 4,L"end");

	*pResult = 0;
}
